{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Index(['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin',\n",
      "       'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome'],\n",
      "      dtype='object')\n"
     ]
    }
   ],
   "source": [
    "diabetes = pd.read_csv('diabetes.csv')\n",
    "print(diabetes.columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "diabetes.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### The diabetes dataset consists of 768 data points, with 9 features each"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dimension of diabetes data: (768, 9)\n"
     ]
    }
   ],
   "source": [
    "print(\"dimension of diabetes data: {}\".format(diabetes.shape))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Outcome 0 means No diabetes, outcome 1 means diabetes\n",
    "Of these 768 data points, 500 are labeled as 0 and 268 as 1:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Outcome\n",
      "0    500\n",
      "1    268\n",
      "dtype: int64\n"
     ]
    }
   ],
   "source": [
    "print(diabetes.groupby('Outcome').size())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x225d1b17f28>"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x225d1bc96a0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import seaborn as sns\n",
    "\n",
    "sns.countplot(diabetes['Outcome'],label=\"Count\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "Pregnancies                 768 non-null int64\n",
      "Glucose                     768 non-null int64\n",
      "BloodPressure               768 non-null int64\n",
      "SkinThickness               768 non-null int64\n",
      "Insulin                     768 non-null int64\n",
      "BMI                         768 non-null float64\n",
      "DiabetesPedigreeFunction    768 non-null float64\n",
      "Age                         768 non-null int64\n",
      "Outcome                     768 non-null int64\n",
      "dtypes: float64(2), int64(7)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "diabetes.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### k-Nearest Neighbors\n",
    "The k-NN algorithm is arguably the simplest machine learning algorithm. Building the model consists only of storing the training dataset. To make a prediction for a new data point, the algorithm finds the closest data points in the training dataset—its “nearest neighbors.”"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Let’s investigate whether we can confirm the connection between model complexity and accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(diabetes.loc[:, diabetes.columns != 'Outcome'], diabetes['Outcome'], stratify=diabetes['Outcome'], random_state=66)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nXQbQXtYscC4AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x225d1b1c7f0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "training_accuracy = []\n",
    "test_accuracy = []\n",
    "# try n_neighbors from 1 to 10\n",
    "neighbors_settings = range(1, 11)\n",
    "\n",
    "for n_neighbors in neighbors_settings:\n",
    "    # build the model\n",
    "    knn = KNeighborsClassifier(n_neighbors=n_neighbors)\n",
    "    knn.fit(X_train, y_train)\n",
    "    # record training set accuracy\n",
    "    training_accuracy.append(knn.score(X_train, y_train))\n",
    "    # record test set accuracy\n",
    "    test_accuracy.append(knn.score(X_test, y_test))\n",
    "\n",
    "plt.plot(neighbors_settings, training_accuracy, label=\"training accuracy\")\n",
    "plt.plot(neighbors_settings, test_accuracy, label=\"test accuracy\")\n",
    "plt.ylabel(\"Accuracy\")\n",
    "plt.xlabel(\"n_neighbors\")\n",
    "plt.legend()\n",
    "plt.savefig('knn_compare_model')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The plot shows the training and test set accuracy on the y-axis against the setting of n_neighbors on the x-axis. Considering if we choose one single nearest neighbor, the prediction on the training set is perfect. But when more neighbors are considered, the training accuracy drops, indicating that using the single nearest neighbor leads to a model that is too complex.\n",
    "The best performance is somewhere around 9 neighbors.\n",
    "\n",
    "The above plot suggests that we should choose n_neighbors=9. Here we are:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy of K-NN classifier on training set: 0.79\n",
      "Accuracy of K-NN classifier on test set: 0.78\n"
     ]
    }
   ],
   "source": [
    "knn = KNeighborsClassifier(n_neighbors=9)\n",
    "knn.fit(X_train, y_train)\n",
    "\n",
    "print('Accuracy of K-NN classifier on training set: {:.2f}'.format(knn.score(X_train, y_train)))\n",
    "print('Accuracy of K-NN classifier on test set: {:.2f}'.format(knn.score(X_test, y_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Logistic Regression\n",
    "Logistic regression is one of the most common classification algorithms."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training set accuracy: 0.781\n",
      "Test set accuracy: 0.771\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "logreg = LogisticRegression().fit(X_train, y_train)\n",
    "print(\"Training set accuracy: {:.3f}\".format(logreg.score(X_train, y_train)))\n",
    "print(\"Test set accuracy: {:.3f}\".format(logreg.score(X_test, y_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The default value of C=1 provides with 78% accuracy on training and 77% accuracy on test set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training set accuracy: 0.700\n",
      "Test set accuracy: 0.703\n"
     ]
    }
   ],
   "source": [
    "logreg001 = LogisticRegression(C=0.01).fit(X_train, y_train)\n",
    "print(\"Training set accuracy: {:.3f}\".format(logreg001.score(X_train, y_train)))\n",
    "print(\"Test set accuracy: {:.3f}\".format(logreg001.score(X_test, y_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Using C=0.01 results in lower accuracy on both the training and the test sets."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training set accuracy: 0.785\n",
      "Test set accuracy: 0.766\n"
     ]
    }
   ],
   "source": [
    "logreg100 = LogisticRegression(C=100).fit(X_train, y_train)\n",
    "print(\"Training set accuracy: {:.3f}\".format(logreg100.score(X_train, y_train)))\n",
    "print(\"Test set accuracy: {:.3f}\".format(logreg100.score(X_test, y_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Using C=100 results in a little bit higher accuracy on training set little bit lower accuracy on test set, confirming that less regularization and a more complex model may not generalize better than default setting. \n",
    "\n",
    "Therefore, we should choose default value C=1."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, let’s look at the coefficients learned by the models with the three different settings of the regularization parameter C.\n",
    "\n",
    "Stronger regularization (C=0.001) pushes coefficients more and more toward zero. Inspecting the plot more closely, we can also see that feature “DiabetesPedigreeFunction”, for C=100, C=1 and C=0.001, the coefficient is positive. This indicates that high “DiabetesPedigreeFunction” feature is related to a sample being “diabetes”, regardless which model we look at."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfQAAAHwCAYAAABQR52cAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3XmYHXWd7/H3NwskQCQsAYEIIYRd\nwxYWhVFAEeUygIqA44KKOBFHRK+IuII6oOJwva4j6CCujDJs6mVTFkVlSSDsArJJomAIBMISyPK9\nf1R10kl6Od3p01Vd/X49Tz/dVef0OR+aTn/r96vfEpmJJEka2kZUHUCSJK0+C7okSQ1gQZckqQEs\n6JIkNYAFXZKkBrCgS5LUABZ0SZIawIIuSVIDWNAlSWqAUVUH6IsNN9wwJ02aVHUMSZIGxcyZMx/P\nzAmtPHdIFfRJkyYxY8aMqmNIkjQoIuLhVp9rl7skSQ1gQZckqQEs6JIkNcCQuocuSaq3RYsWMXv2\nbBYuXFh1lCFlzJgxTJw4kdGjR/f7NSzokqQBM3v2bMaNG8ekSZOIiKrjDAmZybx585g9ezZbbrll\nv1/HLndJ0oBZuHAhG2ywgcW8DyKCDTbYYLV7NSzokqQBZTHvu4H4mVnQJUlqAAu6JKlRHn30UY46\n6ii22mordthhBw466CDuvffeXr/vm9/8JlOmTCEiePzxxwch6cByUJwkqTIX3TKHMy6/h7/Nf55N\nx4/lxAO35bBdNuv362Umb3rTmzj66KM577zzAJg1axaPPfYY22yzTY/fu/fee3PwwQez77779vv9\nq2RBlyRV4qJb5nDyBbfz/KIlAMyZ/zwnX3A7QL+L+tVXX83o0aOZPn36snM777xzS9+7yy679Os9\n68KCLkmqxBmX37OsmHd4ftESzrj8nn4X9DvuuIPddtttlfMLFizgn/7pn7r8np/+9KfssMMO/Xq/\nOrGgS5Iq8bf5z/fp/OoYN24cs2bNGvDXrRMLuiSpEpuOH8ucLor3puPH9vs1d9xxR84///xVzttC\nlySpTU48cNsV7qEDjB09khMP3Lbfr7n//vvzyU9+krPPPptjjz0WgJtuuonnnnuu8S10p61Jkipx\n2C6bcfqbX8Fm48cSwGbjx3L6m1+xWqPcI4ILL7yQK6+8kq222oodd9yRU045hU033bTX7/3617/O\nxIkTmT17NlOnTuV973tfv3NUITKz6gwtmzZtWs6YMaPqGJKkbtx9991sv/32VccYkrr62UXEzMyc\n1sr320KXJKkBLOiSJDWABV2SpAawoEuS1AAWdEmSGsCCLklSA1jQJUmNMtDbp2Ymxx9/PFOmTGHq\n1KncfPPNyx4799xz2Xrrrdl6660599xz2/Lf0yoLuiSpWgsehXPeCAseW+2X6tg+dd999+X+++/n\nrrvu4rTTTuOxx3p/7b333pvf/OY3bLHFFiucv/TSS7nvvvu47777OOuss/jABz4AwBNPPMGpp57K\nDTfcwI033sipp57Kk08+udr/Df1lQZckVevar8Bfr4drv7zaL9Xd9qndrePe2S677MKkSZNWOX/x\nxRfzrne9i4hgr732Yv78+fz973/n8ssv54ADDmD99ddnvfXW44ADDuCyyy5b7f+G/nItd0lSdRY8\nCrN+Arm0+Pyak2Dcxv1+uXZsnzpnzhxe9rKXLTueOHEic+bM6fZ8VSov6BExEpgBzMnMg6vOI0ka\nRNd+pSjmUHy+9stw8JkD/jars31qV0ukR0S356tShy73DwN3Vx1CkjTIOlrnS14sjpe8WByvxr30\nHXfckZkzZ676VgsWsPPOO3f5cdddd/X4mhMnTuSRRx5Zdjx79mw23XTTbs9XpdKCHhETgf8FfK/K\nHJKkCnRunXfoaKX30/77788LL7zA2WefvezcTTfdxM0338ysWbO6/OhtL/RDDjmEH/7wh2Qm119/\nPeuuuy6bbLIJBx54IFdccQVPPvkkTz75JFdccQUHHnhgv7Ovrqpb6F8DPg4s7e2JkqSGmX3j8tZ5\nhyUvFuf7qR3bpx500EFMnjyZKVOmcOyxx/Ltb38bgPXXX5/PfOYz7L777uy+++589rOfZf311+93\n9tVV2fapEXEwcFBmHhcR+wIf6+oeekS8H3g/wOabb77bww8/PLhBJUktc/vU/hvK26fuDRwSEQ8B\n5wH7R8SPV35SZp6VmdMyc9qECRMGO6MkSUNCZQU9M0/OzImZOQk4CrgqM99RVR5Jkoayqu+hS5Kk\nAVD5PHSAzLwGuKbiGJIkDVm20CVJagALuiRJDWBBlyQ1Sn+3T33wwQfZc8892XrrrTnyyCN58cUX\nu3ze6aefzpQpU9h22225/PLLl52/7LLL2HbbbZkyZQpf+tKXlp3vblvWgWZBlyRV4vBLDucV575i\nlY/DLzm836+5OtunnnTSSXzkIx/hvvvuY7311uP73//+Ks+56667OO+887jzzju57LLLOO6441iy\nZAlLlizhgx/8IJdeeil33XUXP/vZz5YtKdvdtqwDzYIuSarEThvtxOgRo1c4N3rEaHbeaOd+v2Z/\nt0/NTK666ioOP7y4mDj66KO56KKLVnnexRdfzFFHHcWaa67JlltuyZQpU7jxxhu58cYbmTJlCpMn\nT2aNNdbgqKOO4uKLLwa635Z1oNVilLskafiZPnU6F//l4hXOjYgRTN9pejff0bv+bp+60UYbMX78\neEaNKspid1uhzpkzh7322mvZcefnrbyV6g033NDv/47+sKBLkioxYa0JHDrlUC6870IWLV3E6BGj\nOWzKYWw4dsMBf6/etk+dO3fuKue62gq1uy1Tly5ddUuSwd5K1YIuSapM51b66rbOodg+9fzzz1/l\nfG8t9O2335758+ezePFiRo0a1e1WqD1tmVr1VqreQ5ckVaajlR7EgLTO+7t9akSw3377LbsYOPfc\nczn00ENXef1DDjmE8847jxdeeIEHH3yQ++67jz322IPdd9+d++67jwcffJAXX3yR8847j0MOOWS1\n/lv6yoIuSarU9KnT2XXjXVe7dQ6rt33ql7/8Zc4880ymTJnCvHnzOOaYYwC45JJL+OxnPwsUPQBH\nHHEEO+ywA294wxv41re+xciRIxk1ahTf/OY3OfDAA9l+++054ogj2HHHHYHut2UdaJVtn9of06ZN\nyxkzZlQdQ5LUDbdP7b+hvH2qJEkaIBZ0SZIawIIuSRpQQ+lWbl0MxM/Mgi5JGjBjxoxh3rx5FvU+\nyEzmzZvHmDFjVut1nIcuSRowHaO5u1qoRd0bM2YMEydOXK3XsKBLkgbM6NGj2XLLLauOMSzZ5S5J\nUgNY0CVJagALuiRJDWBBlySpASzokiQ1gAVdkqQGsKBLktQAFnRJkhrAgi5JUgNY0CVJagALuiRJ\nDWBBlySpASzokiQ1gAVdkqQGsKBLktQAFnRJkhrAgi5JUgNY0CVJagALuiRJDWBBlySpASzokiQ1\ngAVdkqQGsKBLktQAFnRJkhrAgi5JUgNY0CVJagALuiRJDWBBlySpASzokiQ1gAVdkqQGsKBLktQA\nFnRJkhrAgi5JUgNY0CVJagALuiRJDWBBlySpASzokiQ1gAVdkqQGsKBLktQAFnRJkhqgsoIeES+L\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x225d1a95da0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "diabetes_features = [x for i,x in enumerate(diabetes.columns) if i!=8]\n",
    "\n",
    "plt.figure(figsize=(8,6))\n",
    "plt.plot(logreg.coef_.T, 'o', label=\"C=1\")\n",
    "plt.plot(logreg100.coef_.T, '^', label=\"C=100\")\n",
    "plt.plot(logreg001.coef_.T, 'v', label=\"C=0.001\")\n",
    "plt.xticks(range(diabetes.shape[1]), diabetes_features, rotation=90)\n",
    "plt.hlines(0, 0, diabetes.shape[1])\n",
    "plt.ylim(-5, 5)\n",
    "plt.xlabel(\"Feature\")\n",
    "plt.ylabel(\"Coefficient magnitude\")\n",
    "plt.legend()\n",
    "plt.savefig('log_coef')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Decision Tree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on training set: 1.000\n",
      "Accuracy on test set: 0.714\n"
     ]
    }
   ],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "tree = DecisionTreeClassifier(random_state=0)\n",
    "tree.fit(X_train, y_train)\n",
    "print(\"Accuracy on training set: {:.3f}\".format(tree.score(X_train, y_train)))\n",
    "print(\"Accuracy on test set: {:.3f}\".format(tree.score(X_test, y_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The accuracy on the training set is 100%, while the test set accuracy is much worse. This is an indicative that the tree is  overfitting and not generalizing well to new data. Therefore, we need to apply pre-pruning to the tree."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We set max_depth=3, limiting the depth of the tree decreases overfitting. This leads to a lower accuracy on the training set, but an improvement on the test set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on training set: 0.773\n",
      "Accuracy on test set: 0.740\n"
     ]
    }
   ],
   "source": [
    "tree = DecisionTreeClassifier(max_depth=3, random_state=0)\n",
    "tree.fit(X_train, y_train)\n",
    "\n",
    "print(\"Accuracy on training set: {:.3f}\".format(tree.score(X_train, y_train)))\n",
    "print(\"Accuracy on test set: {:.3f}\".format(tree.score(X_test, y_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Feature importance in Decision trees\n",
    "Feature importance rates how important each feature is for the decision a tree makes. It is a number between 0 and 1 for each feature, where 0 means “not used at all” and 1 means “perfectly predicts the target.” The feature importances always sum to 1:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Feature importances:\n",
      "[ 0.04554275  0.6830362   0.          0.          0.          0.27142106\n",
      "  0.          0.        ]\n"
     ]
    }
   ],
   "source": [
    "print(\"Feature importances:\\n{}\".format(tree.feature_importances_))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can then visualize the feature importances."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x225d39d4a90>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_feature_importances_diabetes(model):\n",
    "    plt.figure(figsize=(8,6))\n",
    "    n_features = 8\n",
    "    plt.barh(range(n_features), model.feature_importances_, align='center')\n",
    "    plt.yticks(np.arange(n_features), diabetes_features)\n",
    "    plt.xlabel(\"Feature importance\")\n",
    "    plt.ylabel(\"Feature\")\n",
    "    plt.ylim(-1, n_features)\n",
    "\n",
    "plot_feature_importances_diabetes(tree)\n",
    "plt.savefig('feature_importance')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Feature \"Glucose\" is by far the most important feature."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Random Forest"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "let’s apply a random forest consisting of 100 trees on the diabetes dataset:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on training set: 1.000\n",
      "Accuracy on test set: 0.786\n"
     ]
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "rf = RandomForestClassifier(n_estimators=100, random_state=0)\n",
    "rf.fit(X_train, y_train)\n",
    "print(\"Accuracy on training set: {:.3f}\".format(rf.score(X_train, y_train)))\n",
    "print(\"Accuracy on test set: {:.3f}\".format(rf.score(X_test, y_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The random forest gives us an accuracy of 78.6%, better than the logistic regression model or a single decision tree, without tuning any parameters. However, we can adjust the max_features setting, to see whether the result can be improved."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on training set: 0.800\n",
      "Accuracy on test set: 0.755\n"
     ]
    }
   ],
   "source": [
    "rf1 = RandomForestClassifier(max_depth=3, n_estimators=100, random_state=0)\n",
    "rf1.fit(X_train, y_train)\n",
    "print(\"Accuracy on training set: {:.3f}\".format(rf1.score(X_train, y_train)))\n",
    "print(\"Accuracy on test set: {:.3f}\".format(rf1.score(X_test, y_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It did not, this indicates that the default parameters of the random forest work well."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Feature importance in Random Forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmgAAAF3CAYAAAARh7eaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3Xu8XWV95/HPl4ABBOIFZFKKHMEg\n5RohagGriBSrtIIVqg4doTpS8dba0RarRaq14uBMGXRQ044iVosFrKPQIgyVqCiXBHMhVNRCbEFb\nBDXIXcJv/tjPsZvDOTk7yTnZK+d83q/Xfp21n/WstX7ryfbF12etvVeqCkmSJHXHVsMuQJIkSY9m\nQJMkSeoYA5okSVLHGNAkSZI6xoAmSZLUMQY0SZKkjjGgSZIkdYwBTZIkqWMMaJIkSR1jQJMkSeqY\nrYddgGa3nXfeuUZGRoZdhiRJm8WyZcvurKpdJutnQNNQjYyMsHTp0mGXIUnSZpHke4P08xKnJElS\nxxjQJEmSOsaAJkmS1DEGNEmSpI4xoEmSJHWMAU2SJKljDGiSJEkdY0CTJEnqGAOaJElSxxjQJEmS\nOsaAJkmS1DEGNEmSpI4xoEmSJHWMAU2SJKljDGiSJEkdY0CTJEnqGAOaJElSxxjQJEmSOsaAJkmS\n1DFbD7sAzW6rbl/LyGmXDrsMaYux5sxjhl2CpM3AGTRJkqSOMaBJkiR1jAFNkiSpYwxokiRJHWNA\nkyRJ6hgDmiRJUscY0CRJkjrGgCZJktQxBjRJkqSOMaBJkiR1jAFN65XkZUkqyT7DrkWSpNnCgKbJ\nvAr4GvDKYRciSdJsYUDThJLsABwOvJYW0JJsleTcJKuTXJLk75Mc39YdkmRJkmVJvpRk/hDLlyRp\ni2VA0/ocB1xWVd8GfpTkYOA3gRHgAOC/AocCJNkG+BBwfFUdAnwceN8wipYkaUu39bALUKe9Cji7\nLV/Q3m8DXFhVjwD/luTLbf0zgP2BK5IAzAF+MN5Ok5wCnAIwZ6ddpq14SZK2VAY0jSvJk4Ejgf2T\nFL3AVcDfTbQJsLqqDp1s31W1GFgMMHf+gpqaiiVJmjm8xKmJHA+cX1V7VNVIVe0O3ArcCby83Yu2\nK3BE638zsEuSn1/yTLLfMAqXJGlLZ0DTRF7FY2fLLgZ+AbgNuBH4GHAtsLaqHqIX6j6QZAWwHDhs\n85UrSdLM4SVOjauqjhin7Rzofbuzqu5pl0GvA1a19cuB523OOiVJmokMaNoYlyR5AvA44L1V9W/D\nLkiSpJnEgKYNNt7smiRJmjregyZJktQxBjRJkqSOMaBJkiR1jAFNkiSpYwxokiRJHWNAkyRJ6hgD\nmiRJUsf4O2gaqgN2m8fSM48ZdhmSJHWKM2iSJEkdY0CTJEnqGAOaJElSxxjQJEmSOsaAJkmS1DEG\nNEmSpI4xoEmSJHWMv4OmoVp1+1pGTrt02GVIs8oaf3tQ6jxn0CRJkjrGgCZJktQxBjRJkqSOMaBJ\nkiR1jAFNkiSpYwxokiRJHWNAkyRJ6hgDmiRJUscY0CRJkjpm2gJaknVJlidZnWRFkj9IslVbtyjJ\nOZNsf3KSD2/gMf94E+o9L8mtreYbkhy6gdvf0/7+QpKLNraODTjeGUlub/UuT3LmFO//uCT79r1/\nT5KjpvIYkiRpfNP5qKf7q2ohQJKnAJ8B5gHvrqqlwNJpOOYfA3++Cdu/vaouSnI08DHgwA3dQVV9\nHzh+Q7ZJMqeq1m3osYC/qKoPbsR2gzgOuAS4CaCqTp+m40iSpDE2yyXOqroDOAV4U3qOSHIJQJJn\nJ/l6km+2v8/o23T3JJcluTnJu0cbk/x2kuvazNHHksxpM0jbtbZPr6ffnDZbdmOSVUneOk7JXwGe\n3vaxV6thWZKvJtmntT8tyTeSXJ/kvX21jSS5sS1vn+Rvk6xM8tkk1yZZ1Nbd02alrgUOTXJIkiXt\nOF9KMn99x59IkjVJdm7Li5Jc1ZbPSPLxJFcluSXJW/q2eXWrcUWSTyU5DHgpcFYbu73amB3f+r+w\n/Xutavuc23fsP20zkKsmq1WSJI1vs92DVlW3tOM9ZcyqbwHPq6pnAqfz6BmwZwMnAguBE1rg+CXg\nFcDhbYZuHXBiVZ1Gm7WrqhMn6tf2tVtV7V9VBwCfGKfc3wBWteXFwJur6hDgbcC5rf1/AR+pqmcB\n/zbBab8B+HFVHQi8Fzikb93jgRur6jnAtcCHgOPbcT4OvG+S4wO8te8S54smqKHfPsCL6I3ru5Ns\nk2Q/4J3AkVV1EPB7VfV14Av0ZhQXVtU/j+4gybbAecAr2vhtDZzad4w7q+pg4COtXkmStIGm8xLn\neDJO2zzgk0kWAAVs07fuiqq6CyDJ54DnAg/TCzrXJwHYDrhjnP2+cIJ+XwT2TPIh4FLg8r5tzkry\nLuCHwGuT7AAcBlzY9gEwt/09HHh5W/4U8IFxanguvSBHVd2YZGXfunXAxW35GcD+wBXtOHOAH0xy\nfNjwS5yXVtWDwINJ7gB2BY4ELqqqO1udP5pkH88Abq2qb7f3nwTeCJzd3n+u/V0G/OZ4O0hyCr0Z\nVebstMsGlC9J0uyw2QJakj3phZI7gF/qW/Ve4MtV9bIkI8BVfetqzG6KXsj7ZFW9Y7JDTtQvyUH0\nZpLeCPwW8Jq26u1VdVFfv52An4zeSzeOsfWNV8NEHui77yzA6qp61BcTBjj+eB7mP2ZGtx2z7sG+\n5XX0/v3D5OfxqLImWT96jNH9P0ZVLaY3M8jc+Qs25NiSJM0Km+USZ5JdgI8CH66qsf9Bngfc3pZP\nHrPuV5M8Kcl29G5avxq4Eji+ffGAtn6P1v9nSUZn4Mbt1+7P2qqqLgb+BDh4orqr6m7g1iQntH2k\nhTtaLa9syydOsIuv0QuApPeNyAMm6HczsEvaN0dHLz1OcvyJrOE/LqW+fD39Rl0J/FaSJ7djPKm1\n/xTYcZz+3wJGkjy9vf8vwJIBjiNJkgY0nQFt9Ib91cD/o3cp8U/H6fffgfcnuZrepb1+X6N3+XA5\ncHFVLa2qm4B3AZe3S4ZXAPNb/8XAyiSfXk+/3YCrkiyndy/VZDNxJ9K73LkCWA0c29p/D3hjkuvp\nhczxnEsveK0E/ghYCawd26mqHqL3zc8PtOMsp3dpc33Hn8ifAv8ryVfpzWKtV1Wtpne/25J2jP/Z\nVl0AvL19GWCvvv4PAL9D77LrKuAReuFbkiRNkTx2QktTJckcYJuqeqCFnCuBvVsgE71LnPNPOnvy\njpKmzJozjxl2CdKslWRZVS2arN/m/pLAbLM98OV22TXAqYYzSZI0GQPaNKqqnwKTpmRJkqR+PotT\nkiSpYwxokiRJHWNAkyRJ6hgDmiRJUscY0CRJkjrGgCZJktQxBjRJkqSOMaBJkiR1jD9Uq6E6YLd5\nLPWxM5IkPYozaJIkSR1jQJMkSeoYA5okSVLHGNAkSZI6xoAmSZLUMQY0SZKkjvFnNjRUq25fy8hp\nlw67DEmz1Bp/5kcd5QyaJElSxxjQJEmSOsaAJkmS1DEGNEmSpI4xoEmSJHWMAU2SJKljDGiSJEkd\nY0CTJEnqGAOaJElSxxjQNKEk65IsT7IiyQ1JDmvtI0kqyXv7+u6c5GdJPtzen5HkbcOqXZKkLZkB\nTetzf1UtrKqDgHcA7+9bdwvw633vTwBWb87iJEmaqQxoGtROwI/73t8P/FOSRe39K4C/3exVSZI0\nA/mwdK3PdkmWA9sC84Ejx6y/AHhlkn8D1gHfB35h85YoSdLMY0DT+txfVQsBkhwKnJ9k/771lwHv\nBf4d+OygO01yCnAKwJyddpm6aiVJmiG8xKmBVNU3gJ2BXfraHgKWAf8NuHgD9rW4qhZV1aI528+b\n8lolSdrSOYOmgSTZB5gD3AVs37fqfwBLququJEOpTZKkmcaApvUZvQcNIMBJVbWuP4hV1Wr89qYk\nSVPKgKYJVdWcCdrXAPuP034ecF5bPmP6KpMkaWbzHjRJkqSOMaBJkiR1jAFNkiSpYwxokiRJHWNA\nkyRJ6hgDmiRJUscY0CRJkjrGgCZJktQxBjRJkqSOMaBJkiR1jI960lAdsNs8lp55zLDLkCSpU5xB\nkyRJ6hgDmiRJUscY0CRJkjrGgCZJktQxBjRJkqSOMaBJkiR1jD+zoaFadftaRk67dNhlqCPW+JMr\nkgQ4gyZJktQ5BjRJkqSOMaBJkiR1jAFNkiSpYwxokiRJHWNAkyRJ6hgDmiRJUscY0CRJkjrGgCZJ\nktQxBjRJkqSOMaDNAknumeL9jSS5sS0vSnLOVO5fkqTZzmdxapNU1VJg6bDrkCRpJnEGbRZJckSS\nq5JclORbST6dJG3dmUluSrIyyQdb23lJju/b/jEzcW2fl7TlM5J8vB3jliRv2VznJknSTOIM2uzz\nTGA/4PvA1cDhSW4CXgbsU1WV5AmbsP99gBcAOwI3J/lIVf1sU4uWJGk2cQZt9rmuqm6rqkeA5cAI\ncDfwAPBXSX4TuG8T9n9pVT1YVXcCdwC7ju2Q5JQkS5MsXXff2k04lCRJM9NAAS3J3kmu7Lsx/MAk\n75re0jRNHuxbXgdsXVUPA88GLgaOAy5r6x+mfUbapdDHbcz+x3aoqsVVtaiqFs3Zft6Gn4EkSTPc\noDNofwm8A/gZQFWtBF45XUVp80qyAzCvqv4e+H1gYVu1BjikLR8LbLP5q5MkafYZ9B607avqunY/\n+aiHp6EeDceOwP9Nsi0Q4K2t/S9b+3XAlcC9Q6pPkqRZZdCAdmeSvYACaN/s+8G0VaUpVVU7tL9X\nAVf1tb+pr9uzx9nu34Ff7mt6R2tfA+w/dp9VdcaY7fff1NolSZqNBg1obwQWA/skuR24FThx2qqS\nJEmaxSYNaEm2AhZV1VFJHg9sVVU/nf7SJEmSZqdJvyTQfo7hTW35XsOZJEnS9Br0W5xXJHlbkt2T\nPGn0Na2VSZIkzVKD3oP2mvb3jX1tBew5teVIkiRpoIBWVU+b7kIkSZLUM1BAS/Lq8dqr6vypLUeS\nJEmDXuJ8Vt/ytsALgRsAA5okSdIUG/QS55v73yeZB3xqWiqSJEma5QadQRvrPmDBVBai2emA3eax\n9Mxjhl2GJEmdMug9aF+kPeaJ3k9z7AtcOF1FSZIkzWaDzqB9sG/5YeB7VXXbNNQjSZI06w36Q7Uv\nqaol7XV1Vd2W5APTWpkkSdIsNWhA+9Vx2l48lYVIkiSpZ72XOJOcCrwB2DPJyr5VOwJXT2dhkiRJ\ns9Vk96B9BvgH4P3AaX3tP62qH01bVZIkSbNYqmryXqOdk6fQ+6FaAKrqX6ajKM0ec+cvqPknnT3s\nMjQka/yJFUmzTJJlVbVosn4D3YOW5DeSfAe4FVgCrKE3syZJkqQpNuiXBP4M+GXg2+3B6S/Ee9Ak\nSZKmxaAB7WdVdRewVZKtqurLwMJprEuSJGnWGvSHan+SZAfgq8Cnk9xB7wdrJUmSNMUGnUE7lt7z\nN38fuAz4Z+A3pqsoSZKk2WygGbSqujfJHsCCqvpkku2BOdNbmiRJ0uw06Lc4XwdcBHysNe0GfH66\nipIkSZrNBr3E+UbgcOBugKr6DvCU6SpKkiRpNhs0oD1YVQ+NvkmyNTD4L9xKkiRpYIMGtCVJ/hjY\nLsmvAhcCX5y+siRJkmavQQPaacAPgVXA7wJ/D7xruorakiV5Z5LVSVYmWZ7kOUnWJNl5nL5fn2Rf\nf9f28d0ka9vy8iSHrWefL01y2nj7a+tHkty4cWcnSZI2h/V+izPJU6vqX6rqEeAv20sTSHIo8OvA\nwVX1YAtQj5uof1Udtr79VdXL2n6PAN5WVb/ed6yJtvkC8IUNLl6SJHXGZDNoP/+mZpKLp7mWmWA+\ncGdVPQhQVXdW1fdHVybZLsll7VuxJLmn/T0iyVVJLkryrSSfzkQJ7NHenOSGJKuS7NP2dXKSD7fl\nXdss3Ir2elQgTLJnkm8meVbb7nOtvu8k+e99/Y5O8o12rAvbjxaT5MwkN7XZwg+2thOS3NiO95VN\nGUxJkmaryQJaf0jYczoLmSEuB3ZP8u0k5yZ5ft+6Hejdt/eZqhpvJvKZ9H4IeF96Y334AMe7s6oO\nBj4CvG2c9ecAS6rqIOBgYPXoiiTPAC4Gfqeqrm/NC4FXAAcAr0iye5sFfBdwVDvWUuAPkjwJeBmw\nX1UdSO95rQCnAy9qx3zpAOcgSZLGmCyg1QTLGkdV3QMcApxC7569zyY5ua3+v8Anqur8CTa/rqpu\na5eTlwMjAxzyc+3vsgn6H0kvvFFV66pqbWvfpdXz21W1vK//lVW1tqoeAG4C9gB+mV5ovDrJcuCk\n1n438ADwV0l+k96TJgCuBs5rs4Tj/phxklOSLE2ydN19a8frIknSrDbZkwQOSnI3vZm07doy7X1V\n1U7TWt0WqKrWAVcBVyVZRS/QQC+4vDjJZ6pqvLD7YN/yOgZ7ysPoNoP2H7UW+Fd6s3Sr+9rHqyHA\nFVX1qrE7SfJs4IXAK4E3AUdW1euTPAc4BlieZGFV3dW/XVUtBhYDzJ2/wOAvSdIY651Bq6o5VbVT\nVe1YVVu35dH3hrMxkjwjyYK+poXA99ry6cBdwLmbsaQrgVNbbXOSjP6bPQQcB7w6yX+eZB/XAIcn\neXrbz/ZJ9m73oc2rqr+nd2l2YVu/V1VdW1WnA3cCu0/5WUmSNMMN+jMbGswOwCdHb5ynd2nwjL71\nvw9s238D/jT7PeAFbSZvGbDf6IqqupfeN07fmuTYiXZQVT8ETgb+pp3TNcA+wI7AJa1tCfDWtslZ\n7UsLNwJfAVZM+VlJkjTDZfyrbdLmMXf+gpp/0tnDLkNDsubMY4ZdgiRtVkmWVdWiyfo5gyZJktQx\nBjRJkqSOMaBJkiR1jAFNkiSpYwxokiRJHWNAkyRJ6hgDmiRJUscY0CRJkjrGgCZJktQxG/KAbWnK\nHbDbPJb6a/KSJD2KM2iSJEkdY0CTJEnqGAOaJElSxxjQJEmSOsaAJkmS1DEGNEmSpI4xoEmSJHWM\nv4OmoVp1+1pGTrt02GVoBlvj7+xJ2gI5gyZJktQxBjRJkqSOMaBJkiR1jAFNkiSpYwxokiRJHWNA\nkyRJ6hgDmiRJUscY0CRJkjrGgCZJktQxBrQpkmRdkuVJViS5IclhrX0kyY1TdIyrkixqy2uSrGrH\nuzzJf5qKY0iSpOEzoE2d+6tqYVUdBLwDeP9mOOYL2vGWAn88dmWSOZuhhs1+LEmSZjoD2vTYCfjx\n2MYk2yb5RJv5+maSF0zSvl2SC5KsTPJZYLsJjvcV4Oltm3uSvCfJtcChSQ5JsiTJsiRfSjK/9XtL\nkpvavi9obc9vs4DLWx07JjkiySV95/DhJCe35TVJTk/yNeCEJHsluawd66tJ9pmi8ZQkaVbxYelT\nZ7sky4FtgfnAkeP0eSNAVR3QwsvlSfZeT/upwH1VdWCSA4EbJjj2rwOr2vLjgRur6vQk2wBLgGOr\n6odJXgG8D3gNcBrwtKp6MMkT2rZvA95YVVcn2QF4YIDzfqCqnguQ5Erg9VX1nSTPAc6dYBwkSdJ6\nGNCmzv1VtRAgyaHA+Un2H9PnucCHAKrqW0m+B+y9nvbnAee09pVJVo7Z35eTrANWAu9qbeuAi9vy\nM4D9gSuSAMwBftDWrQQ+neTzwOdb29XA/0zyaeBzVXVb2259PtvOeQfgMODCvm3mjrdBklOAUwDm\n7LTLZPuXJGnWMaBNg6r6RpKdgbHpY6K0s74UVOtZ94KqunNM2wNVta5vv6ur6tBxtj2GXgB8KfAn\nSfarqjOTXAq8BLgmyVHAwzz6Uvi2Y/Zzb/u7FfCT0ZC6PlW1GFgMMHf+gvWdnyRJs5L3oE2Ddply\nDnDXmFVfAU5sffYGngrcPGD7/sCBG1jKzcAubUaPJNsk2S/JVsDuVfVl4A+BJwA7JNmrqlZV1Qfo\nffFgH+B7wL5J5iaZB7xwvANV1d3ArUlOaMdKkoM2sF5JkoQzaFNp9B406M1cnVRV68ZcIjwX+GiS\nVfRmpk5u94BN1P4R4BPt0uZy4LoNKaiqHkpyPHBOC1dbA2cD3wb+urUF+Iuq+kmS97YvKKwDbgL+\nodXxt/QuiX4H+OZ6Dnki8JEk7wK2AS4AVmxIzZIkCVLlFSYNz9z5C2r+SWcPuwzNYGvOPGbYJUjS\nzyVZVlWLJuvnJU5JkqSOMaBJkiR1jAFNkiSpYwxokiRJHWNAkyRJ6hgDmiRJUscY0CRJkjrGgCZJ\nktQxBjRJkqSOMaBJkiR1jM/i1FAdsNs8lvooHkmSHsUZNEmSpI4xoEmSJHWMAU2SJKljDGiSJEkd\nY0CTJEnqGAOaJElSx/gzGxqqVbevZeS0S4ddhiRJj7FmiD8D5QyaJElSxxjQJEmSOsaAJkmS1DEG\nNEmSpI4xoEmSJHWMAU2SJKljDGiSJEkdY0CTJEnqGAOaJElSxxjQZogkuyb5TJJbkixL8o0kL0ty\nRJJLhl2fJEkanAFtBkgS4PPAV6pqz6o6BHgl8IvDrUySJG0MA9rMcCTwUFV9dLShqr5XVR/q75Tk\njCRv63t/Y5KRtvzqJCuTrEjyqda2R5IrW/uVSZ7a2k9o265I8pXWNifJWUmub/1/d9rPWpKkGcqH\npc8M+wE3bOzGSfYD3gkcXlV3JnlSW/Vh4Pyq+mSS1wDnAMcBpwMvqqrbkzyh9X0tsLaqnpVkLnB1\nksur6taNrUuSpNnKGbQZKMn/brNb1w+4yZHARVV1J0BV/ai1Hwp8pi1/CnhuW74aOC/J64A5re1o\n4NVJlgPXAk8GFkxQ3ylJliZZuu6+tRtyapIkzQrOoM0Mq4GXj76pqjcm2RlYOqbfwzw6lG/b/gao\nAY5Tbf+vT/Ic4BhgeZKFbR9vrqovTbqTqsXAYoC58xcMclxJkmYVZ9Bmhn8Etk1yal/b9uP0WwMc\nDJDkYOBprf1K4LeSPLmtG73E+XV6XzYAOBH4Wlu/V1VdW1WnA3cCuwNfAk5Nsk3rs3eSx0/N6UmS\nNLs4gzYDVFUlOQ74iyR/CPwQuBf4ozFdL+Y/LkNeD3y7bb86yfuAJUnWAd8ETgbeAnw8ydvbPn+n\n7eesJAvozZpdCawAVgIjwA3tW6U/pHe/miRJ2kCp8gqThmfu/AU1/6Szh12GJEmPsebMY6Z8n0mW\nVdWiyfp5iVOSJKljDGiSJEkdY0CTJEnqGAOaJElSxxjQJEmSOsaAJkmS1DEGNEmSpI4xoEmSJHWM\nAU2SJKljDGiSJEkd47M4NVQH7DaPpdPwKA1JkrZkzqBJkiR1jAFNkiSpYwxokiRJHWNAkyRJ6hgD\nmiRJUscY0CRJkjrGn9nQUK26fS0jp1067DLUAWv8uRVJ+jln0CRJkjrGgCZJktQxBjRJkqSOMaBJ\nkiR1jAFNkiSpYwxokiRJHWNAkyRJ6hgDmiRJUscY0CRJkjrGgCZJktQxBrQhSLIuyfIkNya5MMn2\nw65pUEm+PuwaJEma6Qxow3F/VS2sqv2Bh4DX969MTyf/barqsGHXIEnSTNfJEDDLfBV4epKRJP+U\n5FzgBmD3JEcn+UaSG9pM2w4ASV6S5FtJvpbknCSXtPYzknw8yVVJbknyltGDJPl8kmVJVic5pa/9\nniTvS7IiyTVJdm3tuyb5u9a+Islho/37tn17kuuTrEzyp63t8UkubdvcmOQVm2EMJUmaUQxoQ5Rk\na+DFwKrW9Azg/Kp6JnAv8C7gqKo6GFgK/EGSbYGPAS+uqucCu4zZ7T7Ai4BnA+9Osk1rf01VHQIs\nAt6S5Mmt/fHANVV1EPAV4HWt/RxgSWs/GFg9pvajgQXtOAuBQ5I8D/g14PtVdVCbIbxs40dIkqTZ\nyYA2HNslWU4vdP0L8H9a+/eq6pq2/MvAvsDVre9JwB70AtgtVXVr6/c3Y/Z9aVU9WFV3AncAu7b2\ntyRZAVwD7E4vXEHvEuslbXkZMNKWjwQ+AlBV66pq7ZjjHN1e36Q347dP2+cq4KgkH0jyK+NsR5JT\nkixNsnTdfY9ZLUnSrLf1sAuYpe6vqoX9DUmgN2v28ybgiqp61Zh+z5xk3w/2La8Dtk5yBHAUcGhV\n3ZfkKmDb1udnVVX9/Qc8hwDvr6qPPWZFcgjwEuD9SS6vqvf0r6+qxcBigLnzF9TY7SVJmu2cQeuu\na4DDkzwdIMn2SfYGvgXsmWSk9RvkHq95wI9bONuH3uzcZK4ETm3HnpNkpzHrvwS8pu++uN2SPCXJ\nLwD3VdVfAx+kd3lUkiRtAGfQOqqqfpjkZOBvksxtze+qqm8neQNwWZI7gesG2N1lwOuTrARuphf+\nJvN7wOIkr6U3s3Yq8I2++i5P8kvAN9rs3z3AbwNPB85K8gjws7adJEnaAPmPq1vaUiTZoaruSS8Z\n/W/gO1X1F8Oua2PMnb+g5p909rDLUAesOfOYYZcgSdMuybKqWjRZPy9xbple1744sJre5cvH3Acm\nSZK2XF7i3AK12bItcsZMkiRNzhk0SZKkjjGgSZIkdYwBTZIkqWMMaJIkSR1jQJMkSeoYA5okSVLH\nGNAkSZI6xt9B01AdsNs8lvoL8pIkPYozaJIkSR1jQJMkSeoYA5okSVLHGNAkSZI6xoAmSZLUMQY0\nSZKkjjGgSZIkdYwBTZIkqWMMaJIkSR1jQJMkSeoYA5okSVLHGNAkSZI6xoAmSZLUMQY0SZKkjjGg\nSZIkdYwBTZIkqWMMaJIkSR1jQJMkSeoYA5okSVLHGNAkSZI6xoAmSZLUMamqYdegWSzJT4Gbh13H\nDLIzcOewi5hBHM+p55hOLcdzam2O8dyjqnaZrNPW01yENJmbq2rRsIuYKZIsdTynjuM59RzTqeV4\nTq0ujaeXOCVJkjrGgCZJktQxBjQN2+JhFzDDOJ5Ty/Gceo7p1HI8p1ZnxtMvCUiSJHWMM2iSJEkd\nY0DTtEjya0luTvLdJKeNs35uks+29dcmGelb947WfnOSF23OurtsY8c0yUiS+5Msb6+Pbu7au2iA\n8XxekhuSPJzk+DHrTkrynfY6afNV3V2bOJ7r+j6fX9h8VXfbAGP6B0luSrIyyZVJ9uhb52d0jE0c\nz83/Ga0qX76m9AXMAf4Z2BN4HLAC2HdMnzcAH23LrwQ+25b3bf3nAk9r+5kz7HMa9msTx3QEuHHY\n59Cl14DjOQIcCJwPHN/X/iSCV6yiAAAGlUlEQVTglvb3iW35icM+py11PNu6e4Z9Dl17DTimLwC2\nb8un9v1v3s/oFI5ne7/ZP6POoGk6PBv4blXdUlUPARcAx47pcyzwybZ8EfDCJGntF1TVg1V1K/Dd\ntr/ZblPGVI816XhW1ZqqWgk8MmbbFwFXVNWPqurHwBXAr22OojtsU8ZT4xtkTL9cVfe1t9cAv9iW\n/Yw+1qaM51AY0DQddgP+te/9ba1t3D5V9TCwFnjygNvORpsypgBPS/LNJEuS/Mp0F7sF2JTPmZ/R\nx9rUMdk2ydIk1yQ5bmpL22Jt6Ji+FviHjdx2NtiU8YQhfEZ9koCmw3izNmO/LjxRn0G2nY02ZUx/\nADy1qu5Kcgjw+ST7VdXdU13kFmRTPmd+Rh9rU8fkqVX1/SR7Av+YZFVV/fMU1balGnhMk/w2sAh4\n/oZuO4tsynjCED6jzqBpOtwG7N73/heB70/UJ8nWwDzgRwNuOxtt9Ji2y8V3AVTVMnr3Yew97RV3\n26Z8zvyMPtYmjUlVfb/9vQW4CnjmVBa3hRpoTJMcBbwTeGlVPbgh284ymzKeQ/mMGtA0Ha4HFiR5\nWpLH0bthfey3Xr4AjH6z6HjgH6t3J+YXgFe2byQ+DVgAXLeZ6u6yjR7TJLskmQPQ/t/fAno3Dc9m\ng4znRL4EHJ3kiUmeCBzd2mazjR7PNo5z2/LOwOHATdNW6ZZj0jFN8kzgY/TCxB19q/yMPtZGj+fQ\nPqPD/maFr5n5Al4CfJvebM07W9t72gcfYFvgQnpfArgO2LNv23e27W4GXjzsc+nKa2PHFHg5sJre\nt5ZuAH5j2OfShdcA4/ksev+v+17gLmB137avaeP8XeB3hn0uXXht7HgChwGr2udzFfDaYZ9LV14D\njOn/A/4dWN5eX+jb1s/oFI3nsD6jPklAkiSpY7zEKUmS1DEGNEmSpI4xoEmSJHWMAU2SJKljDGiS\nJEkdY0CTpI2QZF2S5X2vkY3YxxOSvGHqq/v5/l+a5LTp2v8Exzwuyb6b85jSTOTPbEjSRkhyT1Xt\nsIn7GAEuqar9N3C7OVW1blOOPR3aEyz+it45XTTseqQtmTNokjRFksxJclaS65OsTPK7rX2HJFcm\nuSHJqiTHtk3OBPZqM3BnJTkiySV9+/twkpPb8pokpyf5GnBCkr2SXJZkWZKvJtlnnHpOTvLhtnxe\nko8k+XKSW5I8P8nHk/xTkvP6trknyf9otV6ZZJfWvrA9KHplkr9rv1BPkquS/HmSJcAfAS8Fzmrn\ntFeS17XxWJHk4iTb99VzTpKvt3qO76vhD9s4rUhyZmub9HylmcSHpUvSxtkuyfK2fGtVvQx4LbC2\nqp7VHg1zdZLLgX8FXlZVd7dHxVyT5AvAacD+VbUQIMkRkxzzgap6but7JfD6qvpOkucA5wJHTrL9\nE1uflwJfpPfImv8KXJ9kYVUtBx4P3FBV/y3J6cC7gTcB5wNvrqolSd7T2n+/7fcJVfX8VtcC+mbQ\nkvykqv6yLf9ZG6MPte3mA88F9qH32J2LkrwYOA54TlXdl+RJre/ijThfaYtlQJOkjXP/aLDqczRw\nYN9s0Dx6zz69DfjzJM8DHgF2A3bdiGN+FnozcvQeP3NhktF1cwfY/otVVUlWAf9eVava/lYDI/Qe\nb/PI6HGAvwY+l2QevRC2pLV/kt5jxR5V1wT2b8HsCcAOPPqZkJ+vqkeAm5KMjsdRwCeq6j6AqvrR\nJpyvtMUyoEnS1Am9WaZHPZi6XabcBTikqn6WZA29Z6eO9TCPvvVkbJ9729+tgJ+MExAn82D7+0jf\n8uj7if57MMiNyveuZ915wHFVtaKNwxHj1AO9sRv9O/aYG3u+0hbLe9Akaep8CTg1yTYASfZO8nh6\nM2l3tHD2AmCP1v+nwI59238P2DfJ3DZr9cLxDlJVdwO3JjmhHSdJDpqic9gKGJ0B/M/A16pqLfDj\nJL/S2v8LsGS8jXnsOe0I/KCNyYkDHP9y4DV996o9aZrPV+okA5okTZ2/Am4CbkhyI/AxejNTnwYW\nJVlKL6R8C6Cq7qJ3n9qNSc6qqn8F/hZY2bb55nqOdSLw2iQrgNXAsevpuyHuBfZLsozePV7vae0n\n0bv5fyWwsK99rAuAtyf5ZpK9gD8BrgWuoJ33+lTVZfTuR1va7vF7W1s1XecrdZI/syFJ+rlMwc+H\nSNp0zqBJkiR1jDNokiRJHeMMmiRJUscY0CRJkjrGgCZJktQxBjRJkqSOMaBJkiR1jAFNkiSpY/4/\n5hI28tmO/asAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x225d3998a20>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_feature_importances_diabetes(rf)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "Similarly to the single decision tree, the random forest also gives a lot of importance to the “Glucose” feature, but it also chooses “BMI” to be the 2nd most informative feature overall. The randomness in building the random forest forces the algorithm to consider many possible explanations, the result being that the random forest captures a much broader picture of the data than a single tree."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Gradient Boosting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on training set: 0.917\n",
      "Accuracy on test set: 0.792\n"
     ]
    }
   ],
   "source": [
    "from sklearn.ensemble import GradientBoostingClassifier\n",
    "\n",
    "gb = GradientBoostingClassifier(random_state=0)\n",
    "gb.fit(X_train, y_train)\n",
    "\n",
    "print(\"Accuracy on training set: {:.3f}\".format(gb.score(X_train, y_train)))\n",
    "print(\"Accuracy on test set: {:.3f}\".format(gb.score(X_test, y_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We are likely to be overfitting. To reduce overfitting, we could either apply stronger pre-pruning by limiting the maximum depth or lower the learning rate:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on training set: 0.804\n",
      "Accuracy on test set: 0.781\n"
     ]
    }
   ],
   "source": [
    "gb1 = GradientBoostingClassifier(random_state=0, max_depth=1)\n",
    "gb1.fit(X_train, y_train)\n",
    "\n",
    "print(\"Accuracy on training set: {:.3f}\".format(gb1.score(X_train, y_train)))\n",
    "print(\"Accuracy on test set: {:.3f}\".format(gb1.score(X_test, y_test)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on training set: 0.802\n",
      "Accuracy on test set: 0.776\n"
     ]
    }
   ],
   "source": [
    "gb2 = GradientBoostingClassifier(random_state=0, learning_rate=0.01)\n",
    "gb2.fit(X_train, y_train)\n",
    "\n",
    "print(\"Accuracy on training set: {:.3f}\".format(gb2.score(X_train, y_train)))\n",
    "print(\"Accuracy on test set: {:.3f}\".format(gb2.score(X_test, y_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Both methods of decreasing the model complexity reduced the training set accuracy, as expected. In this case, none of these methods increased the generalization performance of the test set."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can visualize the feature importances to get more insight into our model even though we are not really happy with the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x225d2f5fe80>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_feature_importances_diabetes(gb1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can see that the feature importances of the gradient boosted trees are somewhat similar to the feature importances of the random forests, it gives weight to all of the features in this case."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Support Vector Machine"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on training set: 1.00\n",
      "Accuracy on test set: 0.65\n"
     ]
    }
   ],
   "source": [
    "from sklearn.svm import SVC\n",
    "\n",
    "svc = SVC()\n",
    "svc.fit(X_train, y_train)\n",
    "\n",
    "print(\"Accuracy on training set: {:.2f}\".format(svc.score(X_train, y_train)))\n",
    "print(\"Accuracy on test set: {:.2f}\".format(svc.score(X_test, y_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The model overfits quite substantially, with a perfect score on the training set and only 65% accuracy on the test set.\n",
    "\n",
    "SVM requires all the features to vary on a similar scale. We will need to rescale our data that all the features are approximately on the same scale:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on training set: 0.77\n",
      "Accuracy on test set: 0.77\n"
     ]
    }
   ],
   "source": [
    "from sklearn.preprocessing import MinMaxScaler\n",
    "\n",
    "scaler = MinMaxScaler()\n",
    "X_train_scaled = scaler.fit_transform(X_train)\n",
    "X_test_scaled = scaler.fit_transform(X_test)\n",
    "\n",
    "svc = SVC()\n",
    "svc.fit(X_train_scaled, y_train)\n",
    "\n",
    "print(\"Accuracy on training set: {:.2f}\".format(svc.score(X_train_scaled, y_train)))\n",
    "print(\"Accuracy on test set: {:.2f}\".format(svc.score(X_test_scaled, y_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Scaling the data made a huge difference! Now we are actually in an underfitting regime, where training and test set performance are quite similar but less close to 100% accuracy. From here, we can try increasing either C or gamma to fit a more complex model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on training set: 0.790\n",
      "Accuracy on test set: 0.797\n"
     ]
    }
   ],
   "source": [
    "svc = SVC(C=1000)\n",
    "svc.fit(X_train_scaled, y_train)\n",
    "\n",
    "print(\"Accuracy on training set: {:.3f}\".format(\n",
    "    svc.score(X_train_scaled, y_train)))\n",
    "print(\"Accuracy on test set: {:.3f}\".format(svc.score(X_test_scaled, y_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here, increasing C allows us to improve the model, resulting in 79.7% test set accuracy."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Neural Networks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on training set: 0.71\n",
      "Accuracy on test set: 0.67\n"
     ]
    }
   ],
   "source": [
    "from sklearn.neural_network import MLPClassifier\n",
    "\n",
    "mlp = MLPClassifier(random_state=42)\n",
    "mlp.fit(X_train, y_train)\n",
    "\n",
    "print(\"Accuracy on training set: {:.2f}\".format(mlp.score(X_train, y_train)))\n",
    "print(\"Accuracy on test set: {:.2f}\".format(mlp.score(X_test, y_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The accuracy of the MLP is not as good as the other models at all, this is likely due to scaling of the data. Neural networks also expect all input features to vary in a similar way, and ideally to have a mean of 0, and a variance of 1. We must rescale our data so that it fulfills these requirements."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on training set: 0.823\n",
      "Accuracy on test set: 0.802\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Susan\\Anaconda3\\lib\\site-packages\\sklearn\\neural_network\\multilayer_perceptron.py:564: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (200) reached and the optimization hasn't converged yet.\n",
      "  % self.max_iter, ConvergenceWarning)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "scaler = StandardScaler()\n",
    "X_train_scaled = scaler.fit_transform(X_train)\n",
    "X_test_scaled = scaler.fit_transform(X_test)\n",
    "\n",
    "mlp = MLPClassifier(random_state=0)\n",
    "mlp.fit(X_train_scaled, y_train)\n",
    "\n",
    "print(\"Accuracy on training set: {:.3f}\".format(\n",
    "    mlp.score(X_train_scaled, y_train)))\n",
    "print(\"Accuracy on test set: {:.3f}\".format(mlp.score(X_test_scaled, y_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The results are much better after scaling. As at matter of fact, we have obtained the highest test accuracy so far."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on training set: 0.877\n",
      "Accuracy on test set: 0.755\n"
     ]
    }
   ],
   "source": [
    "mlp = MLPClassifier(max_iter=1000, random_state=0)\n",
    "mlp.fit(X_train_scaled, y_train)\n",
    "\n",
    "print(\"Accuracy on training set: {:.3f}\".format(\n",
    "    mlp.score(X_train_scaled, y_train)))\n",
    "print(\"Accuracy on test set: {:.3f}\".format(mlp.score(X_test_scaled, y_test)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on training set: 0.795\n",
      "Accuracy on test set: 0.792\n"
     ]
    }
   ],
   "source": [
    "mlp = MLPClassifier(max_iter=1000, alpha=1, random_state=0)\n",
    "mlp.fit(X_train_scaled, y_train)\n",
    "\n",
    "print(\"Accuracy on training set: {:.3f}\".format(\n",
    "    mlp.score(X_train_scaled, y_train)))\n",
    "print(\"Accuracy on test set: {:.3f}\".format(mlp.score(X_test_scaled, y_test)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.colorbar.Colorbar at 0x225d3a5f080>"
      ]
     },
     "execution_count": 160,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x225d3955630>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(20, 5))\n",
    "plt.imshow(mlp.coefs_[0], interpolation='none', cmap='viridis')\n",
    "plt.yticks(range(8), diabetes_features)\n",
    "plt.xlabel(\"Columns in weight matrix\")\n",
    "plt.ylabel(\"Input feature\")\n",
    "plt.colorbar()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "From the heat map, it is not easy to point out quickly that which feature (features) have relatively low weights compared to the other features."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Summary\n",
    "We practiced a wide array of machine learning models for classification and regression, what their advantages and disadvantages are, and how to control model complexity for each of them. We saw that for many of the algorithms, setting the right parameters is important for good performance.\n",
    "\n",
    "We should be able to know how to apply, tune, and analyze the models we practiced above."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
